// <1> clk是时钟输入，频率为32.768KHz。

// <2> rst_n是异步复位输入，低电平有效，复位整个系统，为高则整个系统开始
// 工作，其上升沿已经同步于clk。

// <3> start是启动信号，一个clk时钟周期的正脉冲，同步于clk。alarm[7:0]
// 是配置信息，单位为秒，同步于clk。

// <4> 工作模式：收到start后，秒计数器sec_cnt从零开始以秒为单位来记述，
// 计数到alarm[7:0]指定的数值时，产生一个int pluse（时钟周期的正脉冲），秒数计数器回零并停止。
module top
       #(parameter cnt_1s_width = 4'd15)
       (
           input wire clk,
           input wire rst_n,
           input wire start,
           input wire [7: 0] alarm,

           output reg out,
           output reg [31: 0] sec_cnt
       );
reg cnt_en;
reg [cnt_1s_width: 0] cnt_1s;

always@(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
			cnt_en <= 1'b0;
		else if (start)
			cnt_en <= 1'b1;
		else if (sec_cnt == alarm && & cnt_1s )
			cnt_en <= 1'b0;
	end

always@(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
			cnt_1s <= 32'd0;
		else if (cnt_en)
			cnt_1s <= cnt_1s + 1'b1;
	end

always@(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
			sec_cnt <= 32'd0;
		else if (sec_cnt == alarm && & cnt_1s )
			sec_cnt <= 32'd0;
		else if ( & cnt_1s )
			sec_cnt <= sec_cnt + 1'b1;
	end

always@(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
			out <= 1'b0;
		else if ( & cnt_1s && sec_cnt == alarm)
			out <= 1'b1;
		else
			out <= 1'b0;
	end
endmodule
